package com.ky.pro.java.mq.kmq.repository;

import com.ky.pro.java.mq.kmq.core.KmqMessage;

import java.util.List;

public interface KmqMessageRepository<T> {

    /**
     * 在指定topic写入消息，返回消息写入后位置
     *
     * @param topic
     * @param kmqMessage
     * @return
     */
    int saveMessageToTopic(String topic, KmqMessage<T> kmqMessage);

    /**
     * 获取指定topic、指定consumer的读取位置（offset)
     *
     * @param topic
     * @param consumerId
     * @return
     */
    int getOffset(String topic, String consumerId);


    /**
     * 存储消费者消费位置
     *
     * @param topic
     * @param consumerId
     * @param offset
     * @return
     */
    boolean saveOffset(String topic, String consumerId, int offset);

    /**
     * 指定consumer拉取指定topic消息，返回当前消费后位置
     *
     * @param topic
     * @param consumerId
     * @param currentOffset - 已读取位置
     *                      实际实现时，在获取消息前一定会查一下offset、在获取完消息后更新offset，
     *                      因此这里直接传入offset，避免repository实现的时候又查一次
     * @param batchSize  - 批量拉取大小
     * @return 消费后offset
     */
    List<KmqMessage<T>> getMessage(String topic, String consumerId, int currentOffset, int batchSize);

    /**
     * 设置队列容量
     *
     * @param topic
     * @param capacity
     * @return
     */
    boolean initQueue(String topic, int capacity);

    /**
     * 添加消费者
     *
     * @param topic
     * @param consumerId
     * @return
     */
    boolean addConsumerToTopic(String topic, String consumerId);

    /**
     * 移除消费者
     *
     * @param topic
     * @param consumerId
     * @return
     */
    boolean removeConsumerFromTopic(String topic, String consumerId);

}
